package com.kly.user.service;

import com.fqgj.common.api.Response;
import com.kly.user.dto.*;
import com.kly.user.enums.OnlineStatus;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;

public interface UserService {

    Response<UserInfoDto> changeUserInfo(UserChangeDto userChange, String userCode);

    /**
     * 修改model信息
     * @param chatterInfoChangeDto
     * @return
     */
    Response editModelInfo(ModelInfoChangeDto chatterInfoChangeDto);

    Response<UserInfoDto> getUserByUserCode(String userCode);

    /**
     * meboo与touchu共用一套model资料，在获取model信息时需要传入appCode进行区分
     */
    Response<UserInfoDto> getUserByUserCode(String userCode, String appCode);

    Response<UserCodeDto> selectActiveUser(String userCode);

    Response<List<UserInfoDto>> getUserByUserType(String userType);

    Response<UserBaseDto> getUserBaseInfo(String userCode);

    Response<UserAccountDto> getUserAccount(String userCode);

    Response<String> accountBind(UserAccountDto userAccountDto, String userCode);

    Response<String> removeAccount(String userCode, Integer accountType);

    Response<String> changeBindAccount(String userCode, Integer accountType, String mobile);

    Response<String> removeUser(String userCode);

    Response<String> removeUser(String userCode, String email);

    Response<String> removeUserAccount(String mobile, String email);

    Response<UserBaseDto> getUserBaseInfoByEmail(String email);

    Integer updateOnline(String userCode);

    Integer updateOffline(String userCode);

    /**
     * 创建用户相册
     * @param userCode
     * @param albumType 1 个人照片、2 公开相册、3 私密相册
     * @return
     */
    Response<AlbumDto> createAlbums(String userCode, Integer albumType);

    /**
     * 照片存储
     * @param userCode
     * @param albumType 1 个人照片、2 公开相册、3 私密相册
     * @param imageCode 照片码
     * @param url 照片url
     * @param albumsCode 相册编码
     * @param videoLength 视频长度，添加照片该字段无值
     * @return
     */
    Response<ImagesObjDto> addImageToAlbums(String userCode, Integer albumType,
                                        String imageCode, String url, String albumsCode, Integer videoLength);

    /**
     * 删除照片
     * @param userCode
     * @param imageCode 照片码
     * @param albumsCode 相册编码
     * @return
     */
    Response removeImageFromAlbums(String userCode, String imageCode, String albumsCode);

    /**
     * 获取用户相册
     * @param userCode
     * @param albumType 1 个人照片、2 公开相册、3 私密相册
     * @return
     */
    Response<AlbumDto> getUserImages(String userCode, Integer albumType);

    /**
     * 添加设备信息
     * @param deviceInfoDto 设备信息
     * @return
     */
    Response addDeviceInfo(DeviceInfoDto deviceInfoDto);


    /**
     * 添加聊天会话信息
     * @param conversationDto 接收到的IM平台聊天会话信息
     * @return
     */
    Response<ConversationDto> addUserConversation(ConversationDto conversationDto);

    /**
     * 查询聊天会话信息
     * @param fromUserId 当前聊天用户
     * @param targetId 聊天会话ID, 单聊时为对方的用户ID
     * @return 返回聊天会话信息
     */
    Response<ConversationDto> getConversation(String fromUserId, String targetId);

    /**
     * 消息存储
     * @param receiveMessageDto 接收到的IM平台聊天消息
     * @return
     */
    Response receiveMessage(ReceiveMessageDto receiveMessageDto);


    public Integer offlineByUserCodeList(Set<String> set, OnlineStatus onlineStatus);


    void saveOrUpdateChatOnlineRecord(String userCode,int type);

    public List<UserTurnOnsDto> getuserTurnOnsList();


    void updateUserStatus(String userCode,Integer targetStatus);

    Response<Integer> getUserChatLevel(String fromUserCode, String toUserCode);

    List<UserInfoDto> listUserInfos(List<String> userCodes);

    /**
     * type = 1: aboutMe
     * type = 2: 社交目的
     */
    Integer updateUserProfile(String userCode, Integer type, String content);


    /**
     * chatter端 users列表
     * @param chatterUserCode
     * @return
     */
    List<UserDialogDto> getUsers(String chatterUserCode);


    /**
     * chatter端 model列表
     * @param chatterUserCode
     * @return
     */
    List<ModelDto> getModels(String chatterUserCode, String userCode);

    /**
     * model是否发送过消息给user
     * @param chatterUserCode
     * @param modelUserCode
     * @param userCode
     * @return
     */
    Boolean haveConversationByModel(String chatterUserCode, String modelUserCode, String userCode);

    /**
     * chatter等级
     * @param chatterUserCode
     * @return
     */
    Integer getChatterRating(String chatterUserCode);

    /**
     * 检查是否有注销记录
     * @param userCode
     * @return
     */
    Integer checkLogout(String userCode);

    /**
     * 新增注销记录
     * @param userCode
     */
    void addLogoutRecord(String userCode);

    /**
     * 读取用户gps信息
     * @param userCode
     * @return
     */
    Response<UserGpsDto> getGpsInfo(String userCode);

    /**
     * 获取用户I want & You accept 信息
     */
    Response<UserTagDto> getUserTagInfo(String userCode);

    /**
     * 判断用户当天
     * @param userCode
     * @param dates
     * @return
     */
    Integer checkOnline(String userCode, String dates);

    /**
     * 更新用户等级
     * @param userCode
     * @param chatterRating
     * @return
     */
    int updateChatterRating(String userCode, Integer chatterRating);


    /**
     * 判断是否可以进行聊天
     * @param userCode
     * @return
     */
    boolean canConnect(String userCode);
}
